package dt.inlee.diancan.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import dt.inlee.diancan.dao.api.DcBoutDao;
import dt.inlee.diancan.dao.api.DcBusinessDao;
import dt.inlee.diancan.dao.api.DcFoodDao;
import dt.inlee.diancan.dao.api.DcOrderDao;
import dt.inlee.diancan.dao.api.DcUserDao;
import dt.inlee.domain.DcBout;
import dt.inlee.domain.DcBusiness;
import dt.inlee.domain.DcFood;
import dt.inlee.domain.DcOrder;
import dt.inlee.domain.DcUser;

@Service("diancanService")
public class DiancanService {
    @Resource(name = "dcUserDao")
    private DcUserDao dcUserDao;

    @Resource(name = "dcFoodDao")
    private DcFoodDao dcFoodDao;

    @Resource(name = "dcOrderDao")
    private DcOrderDao dcOrderDao;

    @Resource(name = "dcBusinessDao")
    private DcBusinessDao dcBusinessDao;

    @Resource(name = "dcBoutDao")
    private DcBoutDao dcBoutDao;

    /**
     * 
     * @方法名: saveOrder
     * @功能说明: TODO(下订单)
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月19日下午4:08:21
     * @param order
     */
    public void saveOrUpdateByOrder(DcOrder order) {
       if(order.getId() == null){
           dcOrderDao.save(order);
       }else{
           dcOrderDao.update(order);
       }
    }
    
    /**
     * 
     * @方法名:  deleteOrder
     * @功能说明: TODO(删除订单) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月27日下午12:17:09
     * @param order
     */
    public void deleteOrder(DcOrder order){
        dcOrderDao.delete(order);
    }
    
    /**
     * 
     * @方法名:  foodSort
     * @功能说明: TODO(根据热度排序) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月27日下午2:54:32
     */
    public void foodSort(DcBusiness business){
       if(business == null || business.getFoods()==null){
           return;
       }
       List<DcOrder> orders = dcOrderDao.find("from DcOrder group by food order by count(id) desc");
       if(orders == null || orders.size() == 0){
           return;
       }
       //根据订单数量放入新foods
       List<DcFood> newFoods = new ArrayList<DcFood>();
       for (DcOrder dcOrder : orders) {
           if(business.getFoods().contains(dcOrder.getFood())){
               newFoods.add(dcOrder.getFood());
           }
       }
       //把没有过订单的food放入新foods
       for(DcFood dcFood : business.getFoods()){
           if(!newFoods.contains(dcFood)){
              newFoods.add(dcFood); 
           }
       }
       //替换老foods
       business.setFoods(newFoods);
    } 
    
    /**
     * 
     * @方法名:  saveOrUpdateByUser
     * @功能说明: TODO(保存或修改用户) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月23日下午4:27:49
     * @param user
     */
    public void saveOrUpdateByUser(DcUser user){
        if(user.getId() == null){
            dcUserDao.save(user);
        }else{
            dcUserDao.update(user);
        }
    }

    /**
     * 
     * @方法名: getBusiness
     * @功能说明: TODO(得到当前商家)
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月19日下午4:14:07
     * @param id
     * @return
     */
    public DcBusiness getBusiness(int id) {
        return dcBusinessDao.get(id);
    }

    /**
     * 
     * @方法名: getBout
     * @功能说明: TODO(得到当前轮次)
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月19日下午4:57:46
     * @param boutId
     * @return
     */
    public DcBout getBout(int boutId) {
        return dcBoutDao.get(boutId);
    }

    /**
     * 
     * @方法名: getOrders
     * @功能说明: TODO(根据轮次id得到当前订单)
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月19日下午4:49:57
     * @param boutId
     * @return
     */
    public List<DcOrder> getOrders(int boutId) {
        return dcOrderDao.find("from DcOrder where bout = " + boutId);
    }

    /**
     * 
     * @方法名: findUserByName
     * @功能说明: TODO(根据姓名查找用户)
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月22日上午11:21:33
     * @param name
     * @return
     */
    public DcUser findUserByName(String name) {
        List<DcUser> users = dcUserDao.find("from DcUser where name = ?", name);
        if (users != null && users.size() > 0 ) {
            return dcUserDao.find("from DcUser where name = ?", name).get(0);
        } else {
            return null;
        }
    }
    
    /**
     * 
     * @方法名:  findFoodById
     * @功能说明: TODO(根据id和商家得到food) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月22日下午4:57:16
     * @param id
     * @param businessId
     * @return
     */
    public DcFood findFoodById(int id,int businessId){
        List<DcFood> foods = dcFoodDao.find("from DcFood where id=? and business.id=?",new Integer[]{id,businessId}); 
        if(foods != null && foods.size() > 0){
            return foods.get(0);
        }
        return null;
    }
    
    /**
     * 
     * @方法名:  findOrderByUser
     * @功能说明: TODO(根据轮次id和用户查找是否有订单) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月22日下午5:04:24
     * @param userId
     * @param boutId
     * @return
     */
    public DcOrder findOrderByUser(int userId,int boutId){
        List<DcOrder> orders = dcOrderDao.find("from DcOrder where user.id =? and bout.id=?", new Integer[]{userId, boutId});
        if(orders != null && orders.size() > 0){
            return orders.get(0);
        }
        return null;
    }
    
    /**
     * 
     * @方法名:  getBout
     * @功能说明: TODO(获得开始的轮次) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年9月23日上午11:30:34
     * @return
     */
    public DcBout getBout(){
        String hql = "from DcBout where status=1 and startTime<? order by startTime desc";
        List<DcBout> bouts = dcBoutDao.find(hql,new Date());
        if(bouts != null && bouts.size() > 0){
            return bouts.get(0);
        }
        return null;
    }
    
    /**
     * 
     * @方法名:  gerAllBusiness
     * @功能说明: TODO(得到所有商家) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年10月15日上午10:57:56
     * @return
     */
    public List<DcBusiness> gerAllBusiness(){
        return dcBusinessDao.list();
    }
    
    /**
     * 
     * @方法名:  addBout
     * @功能说明: TODO(新加一个轮次) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年10月15日上午11:02:09
     * @param bout
     */
    public void addBout(DcBout bout){
        dcBoutDao.executBySql("UPDATE dc_bout SET status=0 WHERE status!=0");
        dcBoutDao.save(bout);
    }
    
    /**
     * 
     * @方法名:  updateBout
     * @功能说明: TODO(修改轮次) 
     * @作者: 研发部-鄢松涛
     * @时间: 2014年10月16日上午10:48:45
     * @param bout
     */
    public void updateBout(DcBout bout){
        dcBoutDao.update(bout);
    }

}
